import configparser
import chardet

class IniConfigFile(object):

    def __init__(self, ini_file):
        self.file = ini_file

    def read(self, section, option):
        """
        读取配置文件的参数值

        :Args:
         - sections: 配置文件中[]中的值
         - options: 每组中的键
         - filepath: 配置文件路径

        :Returns:
            返回配置文件节点的值，str类型；获取出错则返回None

        :Example:
         - 例: address = IniConfigFile('D:/a.ini').read('Server', 'server_address')
        """
        # 先判断文件的编码格式
        file_data = open(self.file, 'rb').read()
        file_detect = chardet.detect(file_data)
        file_encoding = file_detect.get('encoding')
        # 读取配置文件
        config = configparser.RawConfigParser()
        try:
            config.readfp(open(self.file, encoding=file_encoding))
            value = config.get(section, option)
        except configparser.NoSectionError:
            value = None
        return value

    def write(self, section, option, value):
        """
        写入配置文件的参数值

        :Args:
         - sections: 配置文件中[]中的值
         - options: 每组中的键
         - value: 写入的值
         - filepath: 配置文件路径

        :Example:
         - 例: IniConfigFile('D:/a.ini').write('Server', 'server_address', '8.8.8.8')
        """
        # 先判断文件的编码格式
        file_data = open(self.file, 'rb').read()
        file_detect = chardet.detect(file_data)
        file_encoding = file_detect.get('encoding')
        # 配置文件写入
        config = configparser.ConfigParser()
        try:
            config.readfp(open(self.file, encoding=file_encoding))
            config.set(section, option, value)
            config.write(open(self.file, "w"))
        except configparser.NoSectionError:
            raise Exception('设置结果失败！')
